#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
import asyncio
import time
import aiohttp
from lxml import etree
#特殊的函数
# async def get_request(url):
#     print('get_request被调用！')
#     #requests是一个不支持异步的模块
#     page_text = requests.get(url).text
#     return page_text


#特殊的函数：不可以出现不支持异步模块的代码，不可以使用requests模块
async def get_request(url):
    #使用aiohttp进行网络请求
    async with aiohttp.ClientSession() as sess:#实例化一个请求对象叫做sess
        #sess.get(url,headers,params,proxy)
        #sess.post(url,headers,data,proxy)
        #proxy参数的用法和requests不一样，剩下参数和requests的用法一样
        #proxy = "http://ip:port"
        async with await sess.get(url=url) as response: #调用get发请求，返回一个响应对象
            # text()返回字符串形式的响应数据
            # read()返回bytes类型的响应数据
            page_text = await response.text() #获取了页面源码数据
            return page_text

#定义一个任务对象的回调函数
#注意：回调函数必须要有一个参数，该参数表示就是该函数的绑定者
#多任务的异步爬虫中数据解析或者持久化存储的操作需要写在任务对象的回调函数中
def parse(task):
    #result():返回的就是特殊函数的返回值
    page_text = task.result()
    tree = etree.HTML(page_text)
    data_text = tree.xpath('//a[@id="feng"]/text()')[0]
    print(data_text)

if __name__ == "__main__":
    start = time.time()
    urls = [
        'http://127.0.0.1:5000/bobo',
        'http://127.0.0.1:5000/jay',
        'http://127.0.0.1:5000/tom'
    ]
    #定义一个任务列表
    tasks = []
    for url in urls:
        #创建三个协程对象
        c = get_request(url)
        #创建三个任务对象
        task = asyncio.ensure_future(c)
        task.add_done_callback(parse)#绑定回调
        tasks.append(task)

    loop = asyncio.get_event_loop()
    #将任务列表中的多个任务注册到了事件循环中
    # loop.run_until_complete(tasks)
    loop.run_until_complete(asyncio.wait(tasks))
    print('总耗时：',time.time()-start)